// ProjectName: go-learn-demo
// PackageName: _4_select
// Description:
// Author: hy.bai
// Date: 2025-07-31 14:29

package main

import "fmt"

// 在某些场景下我们需要同时从多个通道接收数据,这个时候就可以用到golang中给我们提供的select多路复用
func main() {
	// 1.定义两个chan

	// 定义一个int类型的channel
	var ch1 chan int = make(chan int, 10)
	for i := 0; i < 3; i++ {
		ch1 <- (i + 1) * 10
	}

	// 定义一个string类型channel
	var ch2 chan string = make(chan string, 10)
	for i := 0; i < 5; i++ {
		ch2 <- fmt.Sprintf("hello, %d~~~", (i+1)*10)
	}

	// 注意:使用select来获取channel里面的数据的时候不需要关闭channel
	for {
		select {
		case val := <-ch1:
			fmt.Println("ch1:", val)
		case val := <-ch2:
			fmt.Println("ch2:", val)
		default:
			fmt.Println("没有数据")
			// break
			// 注意:这里不能使用break，原因是：此时使用break只会跳出select,而不会结束循环。
			// 这里应该使用return(直接结果程序执行)才会结束循环
			return
		}
	}

}
